﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpActionInterface.h"
#include "IObject.h"



namespace gcmp
{
    class IActionExecuteEvent;
    /// \brief 鼠标操作事件类型
    enum class EnMouseEventType : int32_t
    {
        MET_Invalid = 0,        ///< 无效事件类型。
        MET_Move = 1,           ///< 鼠标移动事件。
        MET_LButtonDown = 2,    ///< 鼠标左键按下。
        MET_LButtonUp = 3,      ///< 鼠标左键弹起。
        MET_LButtonDbClick = 4, ///< 鼠标左键双击。
        MET_RButtonDown = 5,    ///< 鼠标右键按下。
        MET_RButtonUp = 6,      ///< 鼠标右键弹起。
    };

    class IAction;
    class IUiView;
    class Vector3d;

    /// \brief Actions管理接口类。
    FINAL_INTERFACE class GCMP_ACTION_INTERFACE_EXPORT IActionManager
    {
    public:

        static bool Init();

        /// \brief 执行Action操作
        /// \param opAction 需要执行的Action
        /// \return 加入Action栈成功，返回true;否则返回false，如视图未初始化等
        static bool ExecuteAction(OwnerPtr<IAction> opAction);

        /// \brief 取得当前（栈顶的）Action。
        /// \return 当前Action对象指针。
        static IAction* CurrentAction();

        /// \brief 取消并结束掉所有Action。
        /// \return void
        static void Reset();

        /// \brief 获得当前未结束的所有的Action的提示信息。
        /// 
        /// \return 当前未结束的所有的Action的提示信息集合。
        static std::vector<std::wstring> GetPromptMessages();

        /// \brief 处理鼠标事件。
        /// \param pUIView          当前操作的视图
        /// \param mouseEventType   鼠标事件类型
        /// \param pos              鼠标点击处的全局坐标
        /// \return void
        static void HandleMouseEvent(gcmp::IUiView* pUIView, EnMouseEventType mouseEventType, const gcmp::Vector3d& pos);

        /// \brief 处理键盘按下事件。
        /// \param pUIView            当前操作的视图
        /// \param nChar              按下的按键对应的键值
        /// \return void
        static void HandleKeyDown(gcmp::IUiView* pUIView, int nChar);

        /// \brief 处理键盘弹起事件。
        /// \param pUIView            当前操作的视图
        /// \param nChar              弹起的按键对应的键值
        /// \return void
        static void HandleKeyUp(gcmp::IUiView* pUIView, int nChar);

        /// \brief 获取ActionExecuteEvent，用来处理Action执行前后的事件
        /// \return 返回ActionEvent指针
        static IActionExecuteEvent* GetActionEvent();
    };
}

